package com.jdy.hotel.check;

import android.text.TextUtils;

import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.ViewModel;

import com.jdy.hotel.check.Check.CheckView;
import com.jdy.hotel.net.ResponseData;
import com.jdy.hotel.utils.DateUtil;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 自定义ViewModel，继承ViewModel，并且实现CheckView接口
 */
public class CheckViewModel extends ViewModel implements CheckView {
    /**
     * 检查项目
     */
    private List<CheckItem> checkItems;

    /**
     * 有效数据集
     */
    private Map<String, String> dataMap = new HashMap<>();

    private MutableLiveData<ResponseData> formData = new MutableLiveData<>();

    /**
     * 将数据添加至有效数据集
     *
     * @param key 数据的key
     * @param value 数据值
     */
    private void set(String key, Object value) {
        String realValue = null;

        //日期格式进行下格式转换
        if (value instanceof Date)
            realValue = DateUtil.dateFormat(value);

        if (value instanceof String)
            realValue = value.toString();

        if (value instanceof Boolean)
            realValue = (boolean) value ? "1" : "0";

        if (value instanceof Number){
            realValue = String.valueOf(value);
        }

        if (TextUtils.isEmpty(realValue) || key.startsWith(Check.EQUAL_PREFIX))
            return;

        dataMap.put(key, realValue);
    }

    /**
     * 将控件中的数据移动到Map中
     * @return 返回一个Map数据
     */
    public Map<String, String> get(){
        for (CheckItem checkItem : checkItems) {
            set(checkItem.getFieldName(), checkItem.getValue());
        }
        return this.dataMap;
    }

    /**
     * 需要检查数据时调用此方法
     *
     * @return 返回检查结果，没有问题，返回true
     */
    @Override
    public boolean checked() {
        //如果没有检查项目，直接返回成功的检查结果
        if (checkItems == null || checkItems.isEmpty()) return true;

        //循环遍历所有检查项目
        for (CheckItem checkItem : checkItems) {
            if (checkItem.check()) {
                continue;
            }
            formData.setValue(ResponseData.error(checkItem));
            return false;
        }
        return true;
    }

    /**
     * 添加检查项目
     *
     * @param checkItem 检查对象
     */
    @Override
    public void addItem(CheckItem checkItem) {
        if (checkItems == null)
            checkItems = new ArrayList<>();
        checkItems.add(checkItem);
    }

    public MutableLiveData<ResponseData> getFormData() {
        return formData;
    }
}
